home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 19 / CU Amiga Magazine's Super CD-ROM 19 (1998)(EMAP Images)(GB)[!][issue 1998-02].iso / CUCD / Programming / LEDA / incl / LEDA.020+881 / b_node_pq.h < prev    next >
C/C++ Source or Header  |  1994-08-05  |  1KB  |  74 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  3.1c
  4. +
  5. +
  6. +  b_node_pq.h
  7. +
  8. +
  9. +  Copyright (c) 1994  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15. #ifndef LEDA_B_NODE_PQ_H
  16. #define LEDA_B_NODE_PQ_H
  17.  
  18.  
  19. //------------------------------------------------------------------------------
  20. // bounded node priority queue
  21. //
  22. // S. Naeher (1993)
  23. //------------------------------------------------------------------------------
  24.  
  25.  
  26. template <int DELTA> 
  27. class b_node_pq 
  28. {
  29.   node_list bucket[DELTA+1];
  30.  
  31.   node_struct stop_item;
  32.   node_list*  stop;
  33.   node_list*  minptr;  // pointer to bucket of nodes with minimal dist value
  34.   int         val0;    // current dist value of nodes in bucket[0]
  35.  
  36.   node nil_node;       // node to be returned by del_min if queue is empty
  37.  
  38.  
  39. public:
  40.  
  41. b_node_pq(node v = nil)
  42. { minptr = bucket; 
  43.   stop = bucket+DELTA; 
  44.   val0 = 0; 
  45.   stop->append(&stop_item);
  46.   nil_node = v;
  47.  }
  48.  
  49. node del_min()
  50. { while (minptr->empty()) minptr++;
  51.  
  52.   if (minptr == stop) 
  53.   { val0 += DELTA;
  54.     minptr = bucket;
  55.     while (minptr->empty()) minptr++;
  56.    }
  57.  
  58.   return (minptr==stop) ? nil_node : minptr->pop();
  59.  }
  60.  
  61.  
  62. void insert(node w, int d) 
  63. { if ((d-=val0) >= DELTA) d -= DELTA;
  64.   bucket[d].push(w); 
  65.  }
  66.  
  67. void del(node w) { node_list::del_node(w); }
  68.  
  69.  
  70. };
  71.  
  72. #endif
  73.